AWS LambdaのLambda拡張機能を使ってParameter Storeの値を取得する(AWS SAM)

AWS LambdaのLambda拡張機能を使ってParameter Storeの値を取得する(AWS SAM)

お手軽でした。特にキャッシュ機能を活用したい場合におすすめです。自前実装の必要がありません。
Clock Icon2024.09.02

AWS Lambdaには拡張機能(Lambda Extension)があります。

この中にAWS Systems Managerのパラメータストアを利用できる拡張機能があります。今回はAWS SAMを利用して試してみました。

おすすめの方

  • AWS LambdaのLambda拡張機能を使ってParameter Storeの値を取得したい方
  • AWS SAMでLambda拡張機能を試してみたい方

AWS Systems Managerのパラメータストアにデータを追加する

aws ssm put-parameter \
    --name "/Blog/Sample/TEST/message" \
    --type "String" \
    --value "this is test message" \
    --overwrite
aws ssm put-parameter \
    --name "/Blog/Sample/TEST/hello" \
    --type "String" \
    --value "world" \
    --overwrite
aws ssm put-parameter \
    --name "/Blog/Sample/TEST/secret" \
    --type "SecureString" \
    --value "this is secure string message" \
    --overwrite

Lambdaをデプロイする

sam init

sam init \
    --runtime python3.11 \
    --name lambda-extensions-ssm-parameter-store-sample \
    --app-template hello-world \
    --no-tracing \
    --no-application-insights \
    --structured-logging \
    --package-type Zip

テンプレートファイル

Lambda ExtensionsのARNや設定用の環境変数は、下記を参照してください。

template.yaml
AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: lambda-extensions-ssm-parameter-store-sample

Globals:
  Function:
    Timeout: 5
    LoggingConfig:
      LogFormat: JSON

Parameters:
  LambdaExtensionSsmLayerArn:
    Type: String
    Default: "arn:aws:lambda:ap-northeast-1:133490724326:layer:AWS-Parameters-and-Secrets-Lambda-Extension:11"

Resources:
  HelloWorldFunction:
    Type: AWS::Serverless::Function
    Properties:
      CodeUri: hello_world/
      Handler: app.lambda_handler
      Runtime: python3.11
      Architectures:
      - x86_64
      Policies:
        - arn:aws:iam::aws:policy/AmazonSSMReadOnlyAccess
      Layers:
        - !Ref LambdaExtensionSsmLayerArn
      Events:
        HelloWorld:
          Type: Api
          Properties:
            Path: /hello
            Method: get

  HelloWorldFunctionLogGroup:
        Type: AWS::Logs::LogGroup
        Properties:
          LogGroupName: !Sub /aws/lambda/${HelloWorldFunction}

Outputs:
  HelloWorldApi:
    Value: !Sub "https://${ServerlessRestApi}.execute-api.${AWS::Region}.amazonaws.com/Prod/hello/"

Lambdaコード

パラメータストアのNameを指定します。なお、階層構造にして「xxx配下のすべてを取得」はできませんでした。400が返ってきます。

app.py
import os
import json
import requests
import urllib.parse

LAMBDA_EXTENSIONS_SSM_BASE_URL = "http://localhost:2773/systemsmanager/parameters/get"

def lambda_handler(event, context):
    return {
        "statusCode": 200,
        "body": json.dumps(
            {
                "message": get_parameter("/Blog/Sample/TEST/message"),
                "hello": get_parameter("/Blog/Sample/TEST/hello"),
                "secret": get_parameter("/Blog/Sample/TEST/secret", True),
            },
        ),
    }

def get_parameter(name: str, is_secure: bool = False) -> str:
    headers = {
        "X-Aws-Parameters-Secrets-Token": os.environ.get("AWS_SESSION_TOKEN"),
    }
    url = f"{LAMBDA_EXTENSIONS_SSM_BASE_URL}?name={urllib.parse.quote(name)}"

    if is_secure:
        url += "&withDecryption=true"

    resp = requests.get(url, headers=headers)

    if resp.status_code != 200:
        raise ValueError(f"Failed to get parameter: {name}")

    return resp.json()["Parameter"]["Value"]

デプロイ

sam build
sam deploy \
    --guided \
    --region ap-northeast-1 \
    --stack-name lambda-extensions-ssm-parameter-store-sample-stack

動作を確認する

問題なく取得できました。

$ curl https://xxx.execute-api.ap-northeast-1.amazonaws.com/Prod/hello

{
    "message": "this is test message",
    "hello": "world",
    "secret": "this is secure string message"
}

さいごに

お手軽でした。特にキャッシュ機能を活用したい場合におすすめです。自前実装の必要がありません。

参考

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.